//
//
//package rps.client.ai;
//
//import static rps.game.data.FigureKind.FLAG;
//import static rps.game.data.FigureKind.PAPER;
//import static rps.game.data.FigureKind.ROCK;
//import static rps.game.data.FigureKind.SCISSORS;
//import static rps.game.data.FigureKind.TRAP;
//import static rps.game.data.FigureKind.HIDDEN;
//import static java.util.concurrent.TimeUnit.NANOSECONDS;
//
//import java.rmi.RemoteException;
//import java.util.ArrayList;
//import java.util.Collection;
//import java.util.Collections;
//import java.util.ConcurrentModificationException;
//import java.util.Iterator;
//
//import rps.client.GameListener;
//import rps.client.ui.GameLogic;
//import rps.game.Game;
//import rps.game.Movement;
//import rps.game.data.AttackResult;
//import rps.game.data.Figure;
//import rps.game.data.FigureKind;
//import rps.game.data.Move;
//import rps.game.data.Player;
//
///**
// * This class contains an advanced AI, that should participate in the
// * tournament.
// */
//public class TournamentAi implements GameListener {
//	private final int maxDurationForMoveInMilliSeconds;
//	private final int maxDurationForAllMovesInMilliSeconds;
//	private Player player = new Player("Tournament AI");
//	private Player opponent;
//	private Game game;
//	private Figure[] board;
//	private boolean gameOver = false;
//	private boolean win = false;
//	private boolean[] opponentAssignment = new boolean[14];
//	private Collection<Integer> fieldsVisited = new ArrayList<Integer>();
//	private FigureKind[] initAs = new FigureKind[42];
//	private FigureKind[] initRow1 = new FigureKind[]{PAPER, PAPER, ROCK, ROCK, TRAP, SCISSORS, SCISSORS};
//	private FigureKind[] initRow2 = new FigureKind[]{PAPER, PAPER, ROCK, ROCK, FLAG, SCISSORS, SCISSORS};
//	
//	
//	public TournamentAi(int maxDurationForMoveInMilliSeconds, int maxDurationForAllMovesInMilliSeconds) {
//		this.maxDurationForMoveInMilliSeconds = maxDurationForMoveInMilliSeconds;
//		this.maxDurationForAllMovesInMilliSeconds = maxDurationForAllMovesInMilliSeconds;
//		// TODO Auto-generated constructor stub
//	}
//	
//	private void setInitAssignment(){
//		for( int i = 0; i < 7; i++){
//			int rN = (int)(Math.random()*initRow1.length);
//			FigureKind a = initRow1[i];
//			initRow1[i] = initRow1[rN];
//			initRow1[rN] = a;
//		}
//		for( int i = 0; i < 7; i++){
//			int rN = (int)(Math.random()*initRow2.length);
//			FigureKind a = initRow2[i];
//			initRow2[i] = initRow2[rN];
//			initRow2[rN] = a;
//		}
//		for(int i = 28; i < 35; i++)
//			initAs[i] = initRow1[i-28];
//		for(int i = 35; i < 42; i++)
//			initAs[i] = initRow2[i-35];
//	}
//	
//	private FigureKind randomFigure(){
//		int randomNumber = 1+(int)(Math.random()*3);
//		FigureKind myFigure;
//		switch(randomNumber){
//		case 1:
//			myFigure = FigureKind.ROCK;
//			break;
//		case 2:
//			myFigure = FigureKind.PAPER;
//			break;
//		case 3:
//			myFigure = FigureKind.SCISSORS;
//			break;
//		default:
//			myFigure = FigureKind.ROCK;
//		}
//		return myFigure;
//	}
//	
//	@Override
//	public void chatMessage(Player sender, String message) throws RemoteException {
//	}
//
//	@Override
//	public void provideInitialAssignment(Game game) throws RemoteException {
//		this.game = game;
//		setInitAssignment();
//		game.setInitialAssignment(player, initAs);
//		try {
//			opponent = game.getOpponent(player);
//		} catch (RemoteException e) {
//			// TODO Auto-generated catch block
//			e.printStackTrace();
//		}
//
//	}
//
//	@Override
//	public void provideInitialChoice() throws RemoteException {
//		game.setInitialChoice(player, randomFigure());
//
//	}
//
//	@Override
//	public void startGame() throws RemoteException {
//		System.out.println("Ui gestartet");
//
//	}
//	
//	@Override
//	public void provideNextMove() throws RemoteException {
//		Move nextMove = findMove();
//		game.move(player, nextMove.getFrom(), nextMove.getTo());
//	}
//	
//	public Move findMove() {
//		int max = Integer.MIN_VALUE;
//		Movement movement = null;
//		try {
//			movement = new Movement (game, player, game.getField().clone());
//		} catch (RemoteException e1) {
//			// TODO Auto-generated catch block
//			e1.printStackTrace();
//		}
//		int score;
//		Move retMove = null;
//		Collection<Move> moves = movement.findPosMovesAI();
//		try {
//			for (Move m : moves) {
//				try {
//					board = game.getField().clone();
//				} catch (RemoteException e) {
//					// TODO Auto-generated catch block
//					e.printStackTrace();
//				}
//				Movement tempM = new Movement (game, player, movement.getField());
//				tempM.updateBoard(m.getFrom(), m.getTo());
//				score = this.getMinVal(tempM, 0);
//				if (score > max) {
//					retMove = m;
//					max = score;
//				}
//			}
//		} catch (ConcurrentModificationException e) {
//			
//		}
//
//		return retMove;
//	}
//	
//	/**
//	 * Choose the best move for the min player
//	 * @param board the board
//	 * @return the minimum value
//	 */
//	private int getMinVal (Movement movement, int depth) {
//		int min = Integer.MAX_VALUE;
//		int score;
//		//if (board.isGameOver()) {
//		//	return this.scoreFinishedGame(board);
//		//}
//		Collection<Move> moves = movement.findPosMovesAI();
//		try {
//			for (Move m : moves) {
//				Movement tempM = new Movement (game, player, movement.getField());
//				tempM.updateBoard(m.getFrom(), m.getTo());
//				score = this.getMaxVal(tempM, depth + 1);
//				System.out.println(m + " " + score);
//				if (score <= min) {
//					min = score;
//				}
//			}
//		} catch (ConcurrentModificationException e) {
//			
//		}
//		
//		return min;
//	}
//	
//	/**
//	 * Choose the best move for the max player
//	 * @param board the board
//	 * @return the maximum value
//	 */
//	private int getMaxVal (Movement movement, int depth) {
//		int max = Integer.MIN_VALUE;
//		int score;
//		
//		//if (board.isGameOver()) {
//		//	return this.scoreFinishedGame(board);
//		//}
//		
//		if (depth == 3) {
//			return scoreBoard();
//		}
//		
//		Collection<Move> moves = movement.getPosMoves();
//		try {
//			for (Move m : moves) {
//				Movement tempM = new Movement (game, player, movement.getField());
//				tempM.updateBoard(m.getFrom(), m.getTo());
//				score = this.getMinVal(tempM, depth);
//				if (score >= max) {
//					max = score;
//				}
//				moves.remove(m);
//			}
//		} catch (ConcurrentModificationException e) {
//			
//		}
//		
//		return max;
//	}
//	
//	private void scoreBoardOp () {
//		int score = 0;
//		score = scorePositions(opponent);
//		
//	}
//	
//	
//	private int scoreBoard () {
//		int score = 0;
//		score = scorePositions(player);
//		score = score + scoreKindsTogether ();
//		return score;
//	}
//	
//	private int scorePositions (Player p) {
//		int score = 0;
//		for (int i = 0; i < 42; i++) {
//			if (board[i] != null) {
//				if (board[i].belongsTo(p)) {
//					score = score + (i/7);
//				} else {
//					score = score - (i/7);
//				}
//			}
//		}
//		return score;
//	}
//	
//	private int scoreKindsTogether () {
//		FigureKind fromKind;
//		int score = 0;
//		for (int i = 0; i < 42; i++) {
//			if (board[i] != null && board[i].belongsTo(player)) {
//				
//				fromKind = board[i].getKind();
//				
//				if (!fromKind.equals(FLAG) && !fromKind.equals(TRAP)) {
//					Collection<Integer> fields = surroundingFields(i);
//					
//					for(Integer index : fields) {
//						
//						if((board[index].getKind().attack(fromKind).equals(AttackResult.WIN)
//							|| fromKind.attack(board[i].getKind()).equals(AttackResult.WIN))) {
//							
//							score = score + 500;
//						}
//					}
//				}		
//			}	
//		}
//		
//		return score;
//	}
//	
//	private Collection<Integer> surroundingFields(int from){
//		Collection<Integer> fields = new ArrayList<Integer>();
//			if (from >= 7) {
//				if (board[from-7] != null && board[from-7].belongsTo(player))
//					fields.add(from-7);
//			}
//			if (from <= 34) {
//				if (board[from+7] != null && board[from+7].belongsTo(player))
//					fields.add(from+7);
//			}
//			if (!(from % 7 == 6) && from >= 0) {
//				if (board[from+1] != null && board[from+1].belongsTo(player))
//					fields.add(from+1);
//			}
//			if (!(from % 7 == 0) && from < 42) {
//				if (board[from-1] != null && board[from-1].belongsTo(player))
//					fields.add(from-1);
//			}
//		return fields;
//	}
//	
//	private int scoreFinishBoard () {
//		if (!win) {
//			return -100;
//		} else {
//			return 100;
//		}
//	}
//	
//	@Override
//	public void figureMoved() throws RemoteException {
//		// TODO Auto-generated method stub
//
//	}
//
//	@Override
//	public void figureAttacked() throws RemoteException {
//		// TODO Auto-generated method stub
//
//	}
//
//	@Override
//	public void provideChoiceAfterFightIsDrawn() throws RemoteException {
//		game.setUpdatedKindAfterDraw(player, randomFigure());
//
//	}
//
//	@Override
//	public void gameIsLost() throws RemoteException {
//		this.gameOver = true;
//	}
//
//	@Override
//	public void gameIsWon() throws RemoteException {
//		this.gameOver = true;
//	}
//
//	@Override
//	public void gameIsDrawn() throws RemoteException {
//		this.gameOver = true;
//	}
//
//	@Override
//	public String toString() {
//		return "Tournament AI";
//	}
//
//	@Override
//	public Player getPlayer() throws RemoteException {
//		return this.player;
//	}
//	
//}
